/*******************************************************************************
* FileName:         CycLink.cpp
* Author:           王一丁
* Student Number:   3023244344
* Date:             2024/09/23 11:24:55
* Version:          v1.0
* Description:      Data Structure Experiment #2
*                   作业在这个文件中完成，需要补全LinkList类的实现�??
*                   写明必要的注�??
*******************************************************************************/

#include "CycLink.h"
#include<iostream>
CycLink::CycLink(){
    len=0;
    head=nullptr;
}

CycLink::~CycLink(){
}

int CycLink::length() const{
    return len;
}

int CycLink::getData(const int& location) const{
    if(location<0||location>=len)return -1;
    node* cur=head;
    for(int i=0;i<location;i++){
        cur=cur->next;
    }
    return cur->value;
}

void CycLink::insert(const int& data, const int& location){
    
    if(location<0||location>len) return;
    node* newnode =new node;
    newnode->next=nullptr;
    newnode->value=data;
    if(location==0){
        newnode->next=head;
        head=newnode;
        head->next=head;
        len++;
        return;
    }
    node* cur=head;
    for(int i=0;i<location-1;i++){
        cur=cur->next;
    }
    if(cur->next!=nullptr)
    newnode->next=cur->next;
    else newnode->next=head;
    cur->next=newnode;
    len++;
    return;
}

bool CycLink::remove(const int& location){
    if(location<0||location>=len) return false;
    node* cur=head;
    if(len==1){
        cur->value=0;
        cur->next=nullptr;
        len=0;
        return true;
    }
    for(int i=0;i<location-1;i++){
        cur=cur->next;
    
    }
    node* tmp=cur->next;
    cur->next=cur->next->next;
    delete tmp;
    len--;
    return true;

}

void CycLink::converse() {  
    if (len <= 1) return; // 如果链表为空或只有一个节点，则无需反转    
    node *prev = nullptr; // 初始化prev为nullptr，用于跟踪前一个节点  
    node *current = head; // 从头节点开始  
    node *nex = nullptr; // 用于保存当前节点的下一个节点  
  
    // 遍历链表直到回到头节点  
    do {  
       
        nex = current->next; // 保存当前节点的下一个节点  
        current->next = prev; // 反转当前节点的next指针  
        prev = current; // 移动prev到当前节点  
        current = nex; // 移动current到下一个节点  
    } while (current != head); // 当current再次指向head时停止  
  
    // 将最后一个节点的next指针指向反转后的头节点（即原来的尾节点）  
    // 由于prev在循环结束时指向了原来的尾节点（即现在的头节点的前一个节点），  
    // 我们需要将其next指针设置为新的头节点（即prev的下一个节点，也就是原来的头节点）  
    // 但由于我们已经在循环中反转了所有节点的next指针，所以现在prev的next就是新的头节点  
    // 因此，我们不需要显式地设置prev->next = head，因为那已经是正确的了。  
    // 我们只需要更新head指针  
    
    head->next=prev; //std::cout<<head<<" "<<head->next<<"\n";
    head = prev; // 新的头节点是原来的尾节点  

}
void CycLink::append(const CycLink& append_list){
    node* cur=head;
    while((cur->next)!=head){
        cur=cur->next;
        
    }
    cur->next=append_list.head;
    cur=cur->next;
    while(cur->next!=append_list.head){
        cur=cur->next;
    }
    cur->next=head;
    len+=append_list.len;
}